package model

import (
	"time"
	"gorm.io/gorm"
)

// Menu 菜单模型
type Menu struct {
	ID        uint           `json:"id" gorm:"primarykey"`
	ParentID  *uint          `json:"parent_id" gorm:"index"` // 父菜单ID，顶级菜单为null
	Name      string         `json:"name" gorm:"size:50;not null" binding:"required"`
	Path      string         `json:"path" gorm:"size:100"`
	Component string         `json:"component" gorm:"size:100"`
	Redirect  string         `json:"redirect" gorm:"size:100"`
	Meta      string         `json:"meta" gorm:"type:text"` // JSON格式的元数据
	Sort      int            `json:"sort" gorm:"default:0"`
	Hidden    bool           `json:"hidden" gorm:"default:false"`
	Status    int8           `json:"status" gorm:"default:1"` // 1:启用 0:禁用
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
	
	// 关联关系
	Children []Menu `json:"children" gorm:"foreignKey:ParentID"`
	Parent   *Menu  `json:"parent" gorm:"foreignKey:ParentID"`
}

// TableName 指定表名
func (Menu) TableName() string {
	return "menus"
}

// MenuCreateRequest 创建菜单请求
type MenuCreateRequest struct {
	ParentID  *uint  `json:"parent_id"`
	Name      string `json:"name" binding:"required,min=2,max=50"`
	Path      string `json:"path" binding:"max=100"`
	Component string `json:"component" binding:"max=100"`
	Redirect  string `json:"redirect" binding:"max=100"`
	Meta      string `json:"meta"`
	Sort      int    `json:"sort"`
	Hidden    bool   `json:"hidden"`
	Status    int8   `json:"status"`
}

// MenuUpdateRequest 更新菜单请求
type MenuUpdateRequest struct {
	ParentID  *uint  `json:"parent_id"`
	Name      string `json:"name" binding:"required,min=2,max=50"`
	Path      string `json:"path" binding:"max=100"`
	Component string `json:"component" binding:"max=100"`
	Redirect  string `json:"redirect" binding:"max=100"`
	Meta      string `json:"meta"`
	Sort      int    `json:"sort"`
	Hidden    bool   `json:"hidden"`
	Status    int8   `json:"status"`
}

// MenuResponse 菜单响应
type MenuResponse struct {
	ID        uint           `json:"id"`
	ParentID  *uint          `json:"parent_id"`
	Name      string         `json:"name"`
	Path      string         `json:"path"`
	Component string         `json:"component"`
	Redirect  string         `json:"redirect"`
	Meta      interface{}    `json:"meta"` // 解析后的JSON对象
	Sort      int            `json:"sort"`
	Hidden    bool           `json:"hidden"`
	Status    int8           `json:"status"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	Children  []MenuResponse `json:"children,omitempty"`
}

// MenuTree 菜单树结构
type MenuTree struct {
	ID        uint       `json:"id"`
	ParentID  *uint      `json:"parent_id"`
	Name      string     `json:"name"`
	Path      string     `json:"path"`
	Component string     `json:"component"`
	Redirect  string     `json:"redirect"`
	Meta      interface{} `json:"meta"`
	Sort      int        `json:"sort"`
	Hidden    bool       `json:"hidden"`
	Children  []MenuTree `json:"children,omitempty"`
}
